package com.jiuqi.abc.model.dao;

import com.jiuqi.abc.model.bean.ResourceMemberValue;
import com.jiuqi.bi.util.type.GUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 成本池类型维度成员信息DAO
 * <p>
 * 概念区分
 * 维度    name（英文）  title（中文）
 * 维度项  code（英文）  name（中文）
 */
@Repository
public class ABCResourceMemberDao {
    //分摊模型 关联 成本池维度项 表
    private static final String T_TABLE = "ABC_M_MODEL_DIM_ITEM";

    //表ID(主键，没有业务意义) F_AMMDI_ID

    //所属模型ID  与 分摊模型基本信息表 中 模型ID（主键） 关联
    private static final String F_AMM_ID = "AMM_ID";

    //模型关联维度ID  与 分摊模型关联维度信息表 中 表ID(主键) 关联
    private static final String F_AMMD_ID = "AMMD_ID";

    //维度编码
    private static final String F_AMMD_DIM_CODE = "AMMD_DIM_CODE";

    //维度项编码
    private static final String F_AMMD_DIM_ITEM_CODE = "AMMD_DIM_ITEM_CODE";

    //取数公式
    private static final String F_AMMDI_FORMULA = "AMMDI_FORMULA";

    @Autowired
    JdbcTemplate jdbcTemplate;


    //【增】批量新增 成本池维度项信息
    public void batchSaveResourceMembers(List<ResourceMemberValue> resourceMemberValues) {
        String addSql = String.format("INSERT INTO %s VALUES(?,?,?,?,?,?)", T_TABLE);
        List<Object[]> argList = new ArrayList<>();
        for (ResourceMemberValue resourceMemberValue : resourceMemberValues) {
            Object[] args = {GUID.newGUID(), resourceMemberValue.getModelId(),
                    resourceMemberValue.getDimId(), resourceMemberValue.getDimName(),
                    resourceMemberValue.getMemberCode(), resourceMemberValue.getFormula()};
            argList.add(args);
        }

        jdbcTemplate.batchUpdate(addSql, argList);
    }

    //【查】 根据 所属模型ID 和 维度编码  获取 成本池维度项信息
    public Map<String, String> getResourceMemberMap(String modelId, String dimName) {
        String selectSql = String.format("SELECT %s,%s FROM %s WHERE %s = ? AND %s = ?", F_AMMD_DIM_ITEM_CODE, F_AMMDI_FORMULA, T_TABLE, F_AMM_ID, F_AMMD_DIM_CODE);
        Object[] args = {modelId, dimName};
        return jdbcTemplate.query(selectSql, rs -> {
            HashMap<String, String> resourceMemberHashMap = new HashMap<>();
            while (rs.next()) {
                    String code = rs.getString(F_AMMD_DIM_ITEM_CODE);
                    String formula = rs.getString(F_AMMDI_FORMULA);
                    resourceMemberHashMap.put(code, formula);
            }
            return resourceMemberHashMap;
        }, args);
    }


    /**
     * 【查】根据 模型ID 获取 成本池维度项信息集合
     *  模型审核使用
     *
     * @param modelId 模型ID
     * @return 成本池维度项信息集合
     */
    public List<ResourceMemberValue> getResourceMemberValueList(String modelId) {
        String selectSql = String.format("SELECT * FROM %s WHERE %s = ?", T_TABLE, F_AMM_ID);
        return jdbcTemplate.query(selectSql, rs -> {
            List<ResourceMemberValue> valueList = new ArrayList<>();
            while (rs.next()) {
                ResourceMemberValue value = new ResourceMemberValue();
                value.setModelId(rs.getString(F_AMM_ID));
                value.setDimId(rs.getString(F_AMMD_ID));
                value.setDimName(rs.getString(F_AMMD_DIM_CODE));
                value.setMemberCode(rs.getString(F_AMMD_DIM_ITEM_CODE));
                value.setFormula(rs.getString(F_AMMDI_FORMULA));
                valueList.add(value);
            }
            return valueList;
        }, modelId);
    }

//    //【删】 根据  所属模型ID 和 所属维度编码dimName  批量删除 多个成本池维度项信息
//    public void deleteResourceMemberByModelIdAndDimName(String modelId, String dimName) {
//        String deleteSql = String.format("DELETE FROM %s WHERE %s = ? AND %s = ?", T_TABLE, F_AMM_ID, F_AMMD_DIM_CODE);
//        Object[] args = {modelId, dimName};
//        jdbcTemplate.update(deleteSql, args);
//    }

    //【删】根据 所属模型ID 批量删除 多个成本池维度项信息
    public void deleteResourceMemberByModelId(String modelId) {
        String deleteSql = String.format("DELETE FROM %s WHERE %s = ?", T_TABLE, F_AMM_ID);
        Object[] args = {modelId};
        jdbcTemplate.update(deleteSql, args);
    }

}
